home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
COMMUNIC
/
H191.ZIP
/
CA29-3.EXE
/
LISTER.CMD
< prev
next >
Wrap
OS/2 REXX Batch file
|
1992-01-23
|
8KB
|
306 lines
SET TTHRU OFF ; Make 1st to allow typeahead
; ----- List a file, with paging
;
; This script lists a file to the screen, allowing paging back and
; forth with PgUp, PgDn. EOF may be searched, and the EOF search
; may be interrupted (by any keypress).
;
; The script's FSAVE stack is limited to 20 positions - so PgUp only
; goes back through the last 20 pages viewed.
; ------------------------------------------------------------------------
; This script may be FCALLED (S0 passes the file name)
; ------------------------------------------------------------------------
; R.McG, commenced 9/88
; Version 2 to use SCREEN command commenced 2/90
; ----- Usages -----------------
; S0 ------> File name being displayed
; S2 ------> Text being searched (if Flag(1) set)
; N0 ------> Display size in lines
; N1 ------> Display current row #
; N2 ------> # non-blank lines on page
; N3 ------> Current page #
; N4 ------> Read rtn length
; N5 ------> Screen attribute
; FLAG(0) -> If true, searching EOF
; FLAG(1) -> If true, searching for text in S2
; ------------------------------
; Initialization
;
;* TRACE ON
LEGEND "Lister ver 2.0"
SSIZE N0 ; # lines
SAVE 0,0 N0,79 ; Save current screen
CLEAR
N5 = "_TEXT" ; Set text attribute (numeric result)
;
; If file name not passed, query for one.
;
IF NOT NULL S0 GOTO Testfile
S1 = "File to be displayed?"
GOSUB Ask_File ; Ask for an output file
IF NOT SUCCESS GOTO EXIT ; If ESC'd then stop
UPPER S0
;
; Test for file name presence
;
Testfile:
FOPENI S0 text
IF NOT SUCCESS
S0 = S0& " can't be opened"
GOSUB Error
GOTO EXIT
ENDIF
;
; Set-up for display
;
N0 = N0-2 ; # lines display
N3 = 0 ; Set page #
LEGEND S0&": Enter PgUp, PgDn, Home, End, Esc: "
ON ESCAPE GOSUB Exit
SET FLAG(0) OFF ; EOF search
SET FLAG(1) OFF ; Text search
GOTO Page
;
; Terminate script
;
Exit:
RESTORE ; Restore previous screen
IF FCALLED FRET ; If called by another
EXIT ; else stop
;
; Initialize for a page
;
Page:
CLEAR
N1 = 0 ; Current disp line
N2 = 0 ; # non-blank lines
N3 = N3+1 ; Increment page #
;
; Update the legend accordingly
;
IF NOT FLAG(0) ; If not searching EOF
IF NOT FLAG(1) ; If not searchin for text
LEGEND S0&": Enter PgUp, PgDn, Home, End, Esc, F)ind; Page "*N3
ELSE
LEGEND S0&": Searching for text; any keypress to stop; Page "*N3
ENDIF
ELSE
LEGEND S0&": Searching for EOF; any keypress to stop; Page "*N3
ENDIF
;
; Save the position of the start of this page
;
FSAVEI
IF NOT SUCCESS
FSAVEI SHIFT ; Save last 20 pos'ns
FSAVEI
ENDIF
;
; Display a page's worth
;
Loop:
FOR N1 = 0,N0,1
READ S1 80 N4 ; N4 = # chars read
IF EOF GOTO EndFile ; Go no farther
IF NOT NULL S1 ; Skip empty lines
IF FIND S1 "^L" ; Top of form
IF NOT ZERO N2 ; Current page is empty
GOTO Wait ; Go no farther
ELSE
GOTO Loop ; Don't display empty pages
ENDIF
ENDIF
N2 = N2+1 ; Count non-blank lines
IF NOT FLAG(0) ; If not searching EOF
IF NOT FLAG(1) ; If not searching text
PRESERVE S1 ; Preserve c/rs etc
ATSAY N1,0 N5 S1; Display what was read
ELSE ; Searching text
IF FIND S1 S2 GOTO Endfile ; Stop on match; Look for S2 in S1
IF HITKEY GOTO Hitkey ; And searching EOF
ENDIF
ELSE
IF HITKEY GOTO Hitkey
ENDIF
ENDIF ; End not null line
ENDFOR
GOTO Wait
;
; Keypress during loop
;
Hitkey:
KFLUSH ; Flush the keypress
;
; End of file - reposition to last page, and then wait
;
EndFile:
FRESTI ; Restore position to top of current page
IF NOT FLAG(0) AND NOT FLAG(1) GOTO Wait ; If not searching for EOF or text
;
; We were searching - display current page
;
SET FLAG(0) OFF ; Done w/ eof search
SET FLAG(1) OFF ; Done w/ eof search
N3 = N3-1 ; Reset Page # for redisplay
GOTO Page ; Display last page
;
; End of a page - wait for a keypress
;
Wait:
IF FLAG(0) GOTO Page ; EOF search - no wait
IF FLAG(1) GOTO Page ; Text search - no wait
;
; Read the key and interpret
;
KEYGET S1
SWITCH S1
CASE "4900" ; Pgup
GOTO PgUp
ENDCASE
CASE "5100" ; PgDn
GOTO PgDn
ENDCASE
CASE "4700" ; Home
GOTO Home
ENDCASE
CASE "4F00" ; End
GOTO End
ENDCASE
CASE "0D" ; C/r
GOTO PgDn
ENDCASE
CASE "F" ; Find
GOTO Find
ENDCASE
ENDSWITCH
SOUND 100,100
GOTO Wait
;
; Page up (go backwards)
;
PgUp:
FRESTOREI ; Backup current pg
N3 = N3-1 ; Reset Page # for redisplay
FRESTOREI ; Backup one more
IF NOT SUCCESS
SOUND 200,100
GOTO Page
ENDIF
N3 = N3-1 ; Reset Page # for redisplay
GOTO Page
;
; Page down (go forwards)
;
PgDn:
GOTO Page
;
; Home (rewind the file)
;
Home:
N3 = 0 ; Reset Page # for redisplay
REWIND
GOTO Page
;
; End (Search EOF)
;
End:
SET FLAG(0) ON ; Flag searching
GOTO Page
;
; SUBROUTINE: Find a line
; This subroutine modifies S2 and S19
;
Find:
S19 = "_ONESCAPE" ; Save label previously set
ON ESCAPE GOSUB Find_Esc ; Escape out of pop-up
SAVE 20,10 23,70
BOX 20,10 23,70 (default)
ATSAY 20,12 (default) " Find subcommand "
ATSAY 21,12 (default) "Enter the search string (case not signifigant):"
;
; Read a response
;
ATGET 22,12 (default) 56 S2 ; Box is 60 wide
IF NULL S2 GOTO Find_Exit ; Skip if nothing entered
;
; Set-up for text search
;
SET FLAG (1) ON ; Set searching flag
ON ESCAPE GOSUB S19 ; Reset original ON ESCAPE label
RESTORE ; Clear pop-up
GOTO Page ; Start search from this page
;
; Null search string
;
Find_Exit:
ON ESCAPE GOSUB S19 ; Reset original ON ESCAPE label
RESTORE ; Clear pop-up
GOTO Wait ; Wait for another key
;
; Subroutine: Escape entered, or null search string
; .. This subroutine is entered upon ESCAPE at the ATGET instruction
; .. above. Upon return from this subroutine, the instruction after
; .. ATGET will be executed. The string S2 is set to a null value to
; .. imitate no entry, and therefore abort of the pop-up.
;
Find_Esc:
S2 = "" ; Make a null string
RETURN ; Return to instruction after ATGET
;
; ----- Subroutine: Ask for a script file name
; S1 passes the prompt used
; SUCCESS returns fact script file successfully opened
; S0 returns the fname
;
Ask_File:
WOPEN 10 10 13 70 (default) ASK_ESC
ATSAY 10 12 (default) " Lister Fname "
ATSAY 11 12 (default) S1(0:56)
ATSAY 13 30 (default) " Press ESC to cancel "
ATGET 12 12 (default) 54 S0; Read new fname
WCLOSE
;
; Attempt to execute the entry
;
LJ S0 ; Left justify
S0 = S0 &"" ; Trim spaces
UPPER S0 ; Make pretty
IF NOT NULL S0 ; If nothing entered
SET SUCCESS ON
ELSE
SET SUCCESS OFF
ENDIF
RETURN ; And done
;
; ----- Escape during a subwindow
; .. S0 is returned null
;
Ask_Esc:
S0 = "" ; Make a null return
RETURN
;
; ----- Subroutine: Fatal error. Open a window, and display a message
; S0 passes the error message(s)
;
Error:
WOPEN 10,10,12,70 (default) Err_Esc
ATSAY 10,12 (default) " Lister Error "
ATSAY 11,12 (default) S0(0:55); Max msg width 55 chars
ATSAY 12,26 (default) " Press any key to continue "
;
; Wait a keypress
;
KEYGET S0 ; Wait for any key
WCLOSE
RETURN
;
; Escape during this screen
;
Err_Esc:
RETURN